home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / python2.6 / dist-packages / launchpadbugs / html_projectlist.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  9.1 KB  |  194 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''TODO:
  5.  * adjustments to url handling'''
  6. import re
  7. import libxml2
  8. import urlparse
  9. from exceptions import parse_error, PythonLaunchpadBugsParsingError
  10. from buglistbase import LPBugList, LPBugPage
  11. from projectbase import LPProject, ProjectInfo, ProjectPackageInfo, LPProjectPackage
  12. from lphelper import user, unicode_for_libxml2
  13. from utils import valid_lp_url
  14. from lpconstants import BASEURL
  15.  
  16. def noerr(ctx, str):
  17.     pass
  18.  
  19. libxml2.registerErrorHandler(noerr, None)
  20.  
  21. class PInfo(ProjectInfo):
  22.     
  23.     def __init__(self, project_name, project_summary, project_url, project_reviewed, project_registrar, project_registered):
  24.         project_url = valid_lp_url(project_url, BASEURL.PROJECTLIST)
  25.         ProjectInfo.__init__(self, project_name, project_summary, project_url, project_reviewed, project_registrar, project_registered)
  26.  
  27.  
  28.  
  29. class PKGInfo(ProjectPackageInfo):
  30.     
  31.     def __init__(self, package_name, package_url):
  32.         package_url = valid_lp_url(package_url, BASEURL.PROJECTLIST)
  33.         ProjectPackageInfo.__init__(self, package_name, package_url)
  34.  
  35.  
  36.  
  37. class ProjectPackagePage(LPBugPage):
  38.     
  39.     def find_parse_function(connection, url, all_tasks):
  40.         url = valid_lp_url(url, BASEURL.BUGPAGE)
  41.         lp_content = connection.get(url)
  42.         xmldoc = libxml2.htmlParseDoc(unicode_for_libxml2(lp_content.text), 'UTF-8')
  43.         u = urlparse.urlsplit(url)
  44.         if '+allpackages' in u[2]:
  45.             result = ProjectPackagePage.parse_html_project_package_list(xmldoc, all_tasks, url)
  46.         else:
  47.             raise PythonLaunchpadBugsParsingError('package_table', url)
  48.         return '+allpackages' in u[2]
  49.  
  50.     find_parse_function = staticmethod(find_parse_function)
  51.     
  52.     def parse_html_project_package_list(xmldoc, all_tasks, url):
  53.         
  54.         def _parse():
  55.             if not xmldoc.xpathEval('//h1'):
  56.                 xmldoc.freeDoc()
  57.                 return None
  58.             packagelisting = xmldoc.xpathEval('//p/a')
  59.             for package in packagelisting:
  60.                 package_name = package.content
  61.                 package_url = 'http://launchpad.net' + package.prop('href')
  62.                 yield PKGInfo(package_name, package_url)
  63.                 xmldoc.xpathEval('//h1')
  64.             
  65.  
  66.         next = xmldoc.xpathEval('//td[@class="batch-navigation-links"]//a[@rel="next"]//@href')
  67.         m = xmldoc.xpathEval('//td[@class="batch-navigation-index"]')
  68.         if m:
  69.             m = m.pop()
  70.             n = re.search('(\\d+)\\s+results?', m.content)
  71.             parse_error(n, 'ProjectPage.parse_html_project_package_list.length', url = url)
  72.             length = n.group(1)
  73.             n = m.xpathEval('strong')
  74.             batchsize = (int(n[1].content) - int(n[0].content)) + 1
  75.         else:
  76.             length = batchsize = 0
  77.         if next:
  78.             return (_parse(), next[0].content, batchsize, int(length))
  79.         return (_parse(), False, batchsize, int(length))
  80.  
  81.     parse_html_project_package_list = staticmethod(parse_html_project_package_list)
  82.  
  83.  
  84. class ProjectPage(LPBugPage):
  85.     
  86.     def find_parse_function(connection, url, all_tasks):
  87.         url = valid_lp_url(url, BASEURL.BUGPAGE)
  88.         lp_content = connection.get(url)
  89.         xmldoc = libxml2.htmlParseDoc(unicode_for_libxml2(lp_content.text), 'UTF-8')
  90.         u = urlparse.urlsplit(url)
  91.         if 'projects/+all' in u[2]:
  92.             result = ProjectPage.parse_html_project_list(xmldoc, all_tasks, url)
  93.         
  94.         return result
  95.  
  96.     find_parse_function = staticmethod(find_parse_function)
  97.     
  98.     def parse_html_project_list(xmldoc, all_tasks, url):
  99.         getuser_regexp = re.compile('~(.*)')
  100.         
  101.         def _parse():
  102.             if not xmldoc.xpathEval('//div[@id="product-listing"]'):
  103.                 xmldoc.freeDoc()
  104.                 return None
  105.             projectlisting = xmldoc.xpathEval('//div[@id="product-listing"]/div')
  106.             for projects in projectlisting:
  107.                 m = projects.xpathEval('a[1]')
  108.                 if m:
  109.                     url = 'http://launchpad.net%s' % m[0].prop('href')
  110.                     reviewed = True
  111.                 else:
  112.                     m = projects.xpathEval('span[@title]/a[1]')
  113.                     url = 'http://launchpad.net%s' % m[0].prop('href')
  114.                     reviewed = False
  115.                 project_name = m[0].prop('href')[1:]
  116.                 m = projects.xpathEval('div[@style]/div[1]')
  117.                 summary = m[0].content
  118.                 m = projects.xpathEval('div[@style]/div[2]/a[1]')
  119.                 username = user.parse_html_user(m[0])
  120.                 m = projects.xpathEval('div[@style]/div[2]/span[1]')
  121.                 registered = m[0].prop('title')
  122.                 yield PInfo(project_name, summary, url, reviewed, username, registered)
  123.             
  124.  
  125.         next = xmldoc.xpathEval('//td[@class="batch-navigation-links"]//a[@rel="next"]//@href')
  126.         m = xmldoc.xpathEval('//td[@class="batch-navigation-index"]')
  127.         if m:
  128.             m = m.pop()
  129.             n = re.search('(\\d+)\\s+results?', m.content)
  130.             parse_error(n, 'ProjectPage.parse_html_project_list.length', url = url)
  131.             length = n.group(1)
  132.             n = m.xpathEval('strong')
  133.             batchsize = (int(n[1].content) - int(n[0].content)) + 1
  134.         else:
  135.             length = batchsize = 0
  136.         if next:
  137.             return (_parse(), next[0].content, batchsize, int(length))
  138.         return (_parse(), False, batchsize, int(length))
  139.  
  140.     parse_html_project_list = staticmethod(parse_html_project_list)
  141.  
  142.  
  143. class ProjectList(LPBugList):
  144.     '''
  145.     returns a SET of LPBugInfo objects
  146.     searches baseurl and its following pages
  147.     '''
  148.     
  149.     def __init__(self, baseurl, connection = None, all_tasks = False, progress_hook = None):
  150.         if hasattr(baseurl, 'baseurl'):
  151.             baseurl.baseurl = valid_lp_url(baseurl.baseurl, BASEURL.PROJECTLIST)
  152.         else:
  153.             baseurl = valid_lp_url(baseurl, BASEURL.PROJECTLIST)
  154.         LPBugList.__init__(self, baseurl, connection, all_tasks, ProjectPage, progress_hook)
  155.  
  156.     
  157.     def __repr__(self):
  158.         return '<Projectlist %s>' % self.baseurl.split('?')[0]
  159.  
  160.     
  161.     def __str__(self):
  162.         return 'Projectlist([%s])' % ','.join((lambda .0: for i in .0:
  163. repr(i))(self))
  164.  
  165.     
  166.     def add(self, item):
  167.         if not isinstance(item, (ProjectInfo, LPProject)):
  168.             raise AssertionError
  169.         LPBugList.add(self, item)
  170.  
  171.  
  172.  
  173. class ProjectPackageList(LPBugList):
  174.     
  175.     def __init__(self, baseurl, connection = None, all_tasks = False, progress_hook = None):
  176.         LPBugList.__init__(self, baseurl, connection, all_tasks, ProjectPackagePage, progress_hook)
  177.  
  178.     
  179.     def __repr__(self):
  180.         return '<ProjectPackageList %s>' % self.baseurl.split('?')[0]
  181.  
  182.     
  183.     def add(self, item):
  184.         if not isinstance(item, (ProjectPackageInfo, LPProjectPackage)):
  185.             raise AssertionError
  186.         LPBugList.add(self, item)
  187.  
  188.     
  189.     def __str__(self):
  190.         return 'ProjectPackageList([%s])' % ','.join((lambda .0: for i in .0:
  191. repr(i))(self))
  192.  
  193.  
  194.